<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>成功</title>
</head>
<body>
<h1>th语法</h1>

<!--
自然语言： 经过服务端渲染会用服务端数据，否则用默认数据
1、th:text： 取到的值会被放在当前标签的体内，作为文本
2、到底能写th:xxx
  2.1）原生标签，能写的属性，th都可以写
  2.2）th:原生属性 = thymeleaf动态渲染这个属性值
  2.3）修改文本值用  th:text
  2.4）th:xxx  可以进行运算
-->
<h2 th:text="'姓名：'+${userName}" id="h101" th:id="${h1Id}"
    style="color:red"
    th:style="${mycolor}">李四  ${userName}</h2>
<h1>hello  - dsadada</h1>
<hr/>

<h1>测试遍历</h1>
<table>
    <tr>
        <th>索引</th>
        <th>名字</th>
        <th>计数</th>
        <th>even</th>
        <th>odd</th>
        <th>是否第一个</th>
        <th>是否最后一个</th>
        <th>总数量</th>
    </tr>

    <!--    隔行变色-->
    <tr th:each="obj,stat:${arrayList}" th:style="${stat.odd?'color:red':'color:blue'}">
        <td th:text="${stat.index}">1</td>
        <td th:text="${obj}">张三</td>
        <td th:text="${stat.count}"></td>
        <td th:text="${stat.even}"></td>
        <td th:text="${stat.odd}"></td>
        <td th:text="${stat.first}"></td>
        <td th:text="${stat.last}"></td>
        <td th:text="${stat.size}"></td>
    </tr>

    <!--    <tr>-->
    <!--        <td>李四</td>-->
    <!--    </tr>-->
</table>

<hr/>
<h1>测试判断</h1>
<!--  th:each优先级最高  th:if 次之   剩下看情况  -->
<span th:if="${age > 18}" th:text="'成人'+${userName}">成人，少年？</span>
<!--<span th:if="${age <= 18}" th:text="少年">成人，少年？</span>-->
<span th:unless="${age > 18}" th:text="'成人:'+${userName}"></span>

<hr/>
<h1>获取session中的值</h1>
<span th:text="${#session.getAttribute('hello')}"></span>
<!--  session.getAttribute(""hello) -->


<span th:text="${session.hello}"></span>

<hr/>
<h1>非转义（不转义特殊字符）</h1>

<!-- 转义特殊字符 -->
<div th:text="${pre_sign}"></div>

<!--数据库有录入特殊字符。凡是输入框最终保存到数据库都会有入侵风险-->
<div th:utext="${pre_sign}"></div>

<hr/>

<h1>Model，Map，ModelMap，ModelAndView</h1>
<h2>他们里面放的东西，和request.setAttribute 一样的效果</h2>
<!--        model.addAttribute("model_val","Model_6666");
        map.put("map_val","map_666");
        modelMap.addAttribute("modelMap_val","modelMap_6666");
        request.setAttribute("request_val","request_666");-->
<span th:text="${model_val}"></span> <br/>
<span th:text="${map_val}"></span> <br/>
<span th:text="${modelMap_val}"></span> <br/>
<span th:text="${request_val}"></span> <br/>
<span th:text="${session.hello}"></span> <br/>

<hr>
<!--  session.key -->
<!--jsp:include-->
<div id="insert" th:insert="~{ index :: myfooter}">
    <!--    <div id="fragement">-->
    <!--        &copy; 2011 The Good Thymes Virtual Grocery-->
    <!--    </div>-->
</div>

<div id="replace" th:replace="~{ index :: myfooter}"></div>



<div id="include" th:include="~{ index :: myfooter}">
    &copy; 2011 The Good Thymes Virtual Grocery
</div>


<hr/>
<h1>SpringMVC原理</h1>
<ol>
    <li>所有请求SpringMVC的DispatchServlet的doDispatch方法处理</li>
    <li>SpringMVC使用 RequestMappingHandlerAdapter 适配器来执行目标方法（HelloController.hello(xxx,xxx)）</li>
    <li>SpringMVC 利用反射执行目标方法。   method.invoke(this,args)，SpingMVC确定每个参数的值</li>
    <li>SpringMVC 确定参数期间认为 ：model，map，modelMap  底层都是一个  BindingAwareModelMap，都是一个对象</li>
    <li>目标方法执行完成以后，无论返回什么，SPringMVC封装ModelAndView</li>
    <li>ModelAndView 有以前 model，map，modelMap 的所有数据</li>
    <li>到达页面的时候ModelAndView 之前存的所有数据会被取出来，传给页面 </li>
    <li>以前的InternalResourceView，是把ModelMap全部放到请求域</li>
    model.forEach((name, value) -> {
            if (value != null) {
                //放到请求域
                request.setAttribute(name, value);
            } else {
                request.removeAttribute(name);
            }
    });
</ol>

</body>
<!--
th:insert 最简单: insert指定的东西会被放到host tag的body里面,
    - 把被包含的整个标签，全部放到host tag的body里面
    - 把目标的整个标签全部拿来放到当前标签体内

th:replace : 替换host tag
    - 目标的整个标签把当前标签替换

th:include 类似 th:insert , 但是他是把被包含的标签的内容 插入到 host tag、
    -
-->
</html>